#ifndef __JEU
#define __JEU

#include "tetris.h"
#include "pieces.h"
#include "Score.h"

typedef struct
{
    Terrain terrain;
	char tableau_toutes_pieces[100][100];

    int piece_courante;
    int piece_suivante;


    int PosX, PosY; //Position (x,y) de la pièce (du bloc 4*4) dans l'aire de jeu.
    int rotation;
    bool finJeu;

    score Score;
}plateauDeJeu;


/**
 *@brief initialise le plateau de jeu avec un tableau modele
 *@param reference sur la structure Jeu
 *@param pointeur sur un caractere
 */
void jeuInit(plateauDeJeu& jeu, const char*);

/**
 *@brief recupere le Terrain de jeu
 *@param reference constante sur la structure Jeu
 *@return structure Terrain
 */
Terrain jeuGetTerrain(const plateauDeJeu& jeu);


//pour les pieces
/**
 *@brief recupere la piece courante
 *@param reference constante sur la structure plateauDeJeu
 *@return entier
 */
int jeuGetPiece_courante(const plateauDeJeu& jeu);

/**
 *@brief modifie la piece courante avec la piece suivante donnee en parametre
 *@param reference sur la structure plateauDeJeu
 *@param entier
 */
void jeuSetPiece_courante(plateauDeJeu& jeu, int piece_suivante);

/**
 *@brief recupere la piece suivante
 *@param reference constante sur la structure plateuDeJeu
 *@return entier
 */
int jeuGetPiece_suivante(const plateauDeJeu& jeu);


//pour la rotation
/**
 *@brief recupere la rotation en cours pour la piece courante
 *@param reference constante sur la structure plateauDeJeu
 *@return entier
 */
int jeuGetRotation(const plateauDeJeu& jeu);

/**
 *@brief modifie la rotation de la piece courante en additionnant R modulo 4
 *@param reference constante sur la structure plateauDeJeu
 *@param entier
 */
void jeuSetRotation(plateauDeJeu & jeu, int R);


/**
 *@brief recupere la colonne gauche de la piece courante sur le terrain
 *@param reference constante sur la structure plateauDeJeu
 *@return entier
 */
int jeuGetPosX(const plateauDeJeu& jeu);

/**
 *@brief modifie la colonne de la piece courante
 *@param reference constante sur la structure plateauDeJeu
 *@param entier
 *@return entier
 */
void jeuSetPosX(plateauDeJeu& jeu, int X);

/**
 *@brief recupere la ligne superieure de la piece courante sur le terrain
 *@param reference constante sur la structure plateauDeJeu
 *@return entier
 */
int jeuGetPosY(const plateauDeJeu& jeu);

/**
 *@brief modifie la ligne de la piece courante
 *@param reference sur la structure plateauDeJeu
 *@param entier
 *@return entier
 */
void jeuSetPosY(plateauDeJeu& jeu, int Y);


/**
 *@brief On regarde si il y a ou non colision en position (x,y) pour la piece
 *@param reference constante sur la structure plateauDeJeu
 *@param entier
 *@param entier
 *@param entier
 *@return entier
 */
int Collision(const plateauDeJeu &, int, int, int );

/**
 *@brief Place la piece dans le plateau de jeu, et fait apparaitre la nouvelle
 *@param reference sur la structure plateauDeJeu
 */
void ajoutPiecePlateau(plateauDeJeu& jeu);

/**
 *@brief si il n'y a pas de collision, on fait descendre la piece d'un cran, sinon on l'ajoute au tableau
 *@param reference sur la structure plateauDeJeu
 */
void descentePiece(plateauDeJeu& jeu);

/**
 *@brief rotation de la piece dans le tableau
 *@param reference sur la structure plateauDeJeu
 */
void rotation(plateauDeJeu& jeu);

/**
 *@brief les differentes actions possibles au clavier
 *@param reference sur la structure plateauDeJeu
 *@param caractere
 */
void jeuActionClavier(plateauDeJeu& jeu, const char touche);


//pour les lignes completes
/**
 *@brief regarde si une ligne est complete
 *@param reference constante sur la structure plateauDeJeu
 *@param entier
 *@return booleen
 */
bool estLigneComplete(const plateauDeJeu &,int);

/**
 *@brief parcoure le tableau, si une ligne est complete, on l'enleve du tableau et
 descend toutes les autres lignes d'un cran
 *@param reference sur la structure plateauDeJeu
 */
void LigneComplete(plateauDeJeu &);

#endif
